namespace Mbl.ParameterizedTest.FluentCollectionBuilding.RowCollectors
{
    public abstract class TestRowCollector<TIn1, TOut> : ITestCollector<TIn1, TOut>
    {        
        private readonly TestCollection<TIn1, TOut> _testCollection;        

        protected TestRowCollector(TestCollection<TIn1, TOut> testCollection)
        {
            _testCollection = testCollection;            
        }        
        
        public void Evaluate()
        {
            _testCollection.Evaluate();
        }

        public void AddTestCase(TestCase<TIn1, TOut> testCase)
        {
            _testCollection.AddTestCase(testCase);
        }
        
        protected TestCase<TIn1, TOut> CreateTestCase(TIn1 in1)
        {
            var inputRow = new TestInput<TIn1>(in1);
            return new TestCase<TIn1, TOut>(inputRow);
        }
    }

    public abstract class TestRowCollector<TIn1, TIn2, TOut> : ITestCollector<TIn1, TIn2, TOut>
    {        
        private readonly TestCollection<TIn1, TIn2, TOut> _testCollection;        

        protected TestRowCollector(TestCollection<TIn1, TIn2, TOut> testCollection)
        {
            _testCollection = testCollection;            
        }        
        
        public void Evaluate()
        {
            _testCollection.Evaluate();
        }

        public void AddTestCase(TestCase<TIn1, TIn2, TOut> testCase)
        {
            _testCollection.AddTestCase(testCase);
        }
        
        protected TestCase<TIn1, TIn2, TOut> CreateTestCase(TIn1 in1, TIn2 in2)
        {
            var inputRow = new TestInput<TIn1, TIn2>(in1, in2);
            return new TestCase<TIn1, TIn2, TOut>(inputRow);
        }
    }

    public abstract class TestRowCollector<TIn1, TIn2, TIn3, TOut> : ITestCollector<TIn1, TIn2, TIn3, TOut>
    {        
        private readonly TestCollection<TIn1, TIn2, TIn3, TOut> _testCollection;        

        protected TestRowCollector(TestCollection<TIn1, TIn2, TIn3, TOut> testCollection)
        {
            _testCollection = testCollection;            
        }        
        
        public void Evaluate()
        {
            _testCollection.Evaluate();
        }

        public void AddTestCase(TestCase<TIn1, TIn2, TIn3, TOut> testCase)
        {
            _testCollection.AddTestCase(testCase);
        }
        
        protected TestCase<TIn1, TIn2, TIn3, TOut> CreateTestCase(TIn1 in1, TIn2 in2, TIn3 in3)
        {
            var inputRow = new TestInput<TIn1, TIn2, TIn3>(in1, in2, in3);
            return new TestCase<TIn1, TIn2, TIn3, TOut>(inputRow);
        }
    }

    public abstract class TestRowCollector<TIn1, TIn2, TIn3, TIn4, TOut> : ITestCollector<TIn1, TIn2, TIn3, TIn4, TOut>
    {        
        private readonly TestCollection<TIn1, TIn2, TIn3, TIn4, TOut> _testCollection;        

        protected TestRowCollector(TestCollection<TIn1, TIn2, TIn3, TIn4, TOut> testCollection)
        {
            _testCollection = testCollection;            
        }        
        
        public void Evaluate()
        {
            _testCollection.Evaluate();
        }

        public void AddTestCase(TestCase<TIn1, TIn2, TIn3, TIn4, TOut> testCase)
        {
            _testCollection.AddTestCase(testCase);
        }
        
        protected TestCase<TIn1, TIn2, TIn3, TIn4, TOut> CreateTestCase(TIn1 in1, TIn2 in2, TIn3 in3, TIn4 in4)
        {
            var inputRow = new TestInput<TIn1, TIn2, TIn3, TIn4>(in1, in2, in3, in4);
            return new TestCase<TIn1, TIn2, TIn3, TIn4, TOut>(inputRow);
        }
    }

    public abstract class TestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TOut> : ITestCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TOut>
    {        
        private readonly TestCollection<TIn1, TIn2, TIn3, TIn4, TIn5, TOut> _testCollection;        

        protected TestRowCollector(TestCollection<TIn1, TIn2, TIn3, TIn4, TIn5, TOut> testCollection)
        {
            _testCollection = testCollection;            
        }        
        
        public void Evaluate()
        {
            _testCollection.Evaluate();
        }

        public void AddTestCase(TestCase<TIn1, TIn2, TIn3, TIn4, TIn5, TOut> testCase)
        {
            _testCollection.AddTestCase(testCase);
        }
        
        protected TestCase<TIn1, TIn2, TIn3, TIn4, TIn5, TOut> CreateTestCase(TIn1 in1, TIn2 in2, TIn3 in3, TIn4 in4, TIn5 in5)
        {
            var inputRow = new TestInput<TIn1, TIn2, TIn3, TIn4, TIn5>(in1, in2, in3, in4, in5);
            return new TestCase<TIn1, TIn2, TIn3, TIn4, TIn5, TOut>(inputRow);
        }
    }

    public abstract class TestRowCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut> : ITestCollector<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut>
    {        
        private readonly TestCollection<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut> _testCollection;        

        protected TestRowCollector(TestCollection<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut> testCollection)
        {
            _testCollection = testCollection;            
        }        
        
        public void Evaluate()
        {
            _testCollection.Evaluate();
        }

        public void AddTestCase(TestCase<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut> testCase)
        {
            _testCollection.AddTestCase(testCase);
        }
        
        protected TestCase<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut> CreateTestCase(TIn1 in1, TIn2 in2, TIn3 in3, TIn4 in4, TIn5 in5, TIn6 in6)
        {
            var inputRow = new TestInput<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6>(in1, in2, in3, in4, in5, in6);
            return new TestCase<TIn1, TIn2, TIn3, TIn4, TIn5, TIn6, TOut>(inputRow);
        }
    }

}